﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Fiuba.Algo3.Titiritero;
using LibreriaDeClases;
using System.Xml;
namespace BattleCity
{
    public abstract class Objeto : IObjetoVivo, IPosicionable, IDireccionable
    {
        //Atributos
        protected int energia;
	    protected string nombre;

        //Propiedades
        public IFigura Figura
        {
            get;
            set;
        }  
        public int Energia 
        { 
            get 
            { 
                return energia;
            } 
            protected set
            {
                energia = value;
            }
        }
        public int X
        {
            get
            {		
				//si aun no fue lanzado al escenario, no tiene figura
                //entonces da posicion -1
                if (Figura != null)
                {
                return Figura.getUbicacion().X;
                }
                return -1;
            }
        }
        public int Y
        {
            get
            {
                if (Figura != null)
                {
                return Figura.getUbicacion().Y;
            }
                return -1;
            }
        }
        virtual public IDireccion Direccion
        {
            get
            {
                return new Arriba();
            }
        }

        //Metodos Abstractos
        public abstract void Vivir();
        public abstract void FueraDelTerreno();
        public abstract void Persistir(XmlDocument xml, XmlNode subnodo);

        //Metodos
        public string getNombre()
        {
            return this.nombre;
        }

        //double dispach
        public bool ImpactaContra(Objeto objeto)
        {
            if (objeto != this && this.Figura.SeSuperponeCon(objeto.Figura))
            {
                return objeto.ImpactaCon(this);
            }
            return false;
        }
        virtual public bool ImpactaCon(Objeto objeto) { return false; }
        virtual public bool ImpactaCon(Tanque tanque) { return false; }
        virtual public bool ImpactaCon(Arma arma) { return false; }
        virtual public bool ImpactaCon(Proyectil proyectil) { return false; }
        virtual public bool ImpactaCon(Muro muro) { return false; }
        virtual public bool ImpactaCon(Base baseOb) { return false; }
        virtual public bool ImpactaCon(BonusVelocidad bonus) { return false; }
        virtual public bool ImpactaCon(BonusVida bonus) { return false; }
        virtual public bool ImpactaCon(Teletransportador bonus) { return false; }
        
        virtual public void Daniar(int danio)
        {
            this.energia = this.energia - danio;

            if (this.energia <= 0)
            {
                Escenario.getEscenario().Objetos.Remove(this);
            }
        }
 
    }
}
